package praktikum4Reservierungskomponente.Verwalter;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import praktikum4GastKomponente.Datentyp.DGastNr;
import praktikum4Reservierungskomponente.Datentyp.DReservierungsNr;
import praktikum4Reservierungskomponente.Datentyp.DZusatzleistungNr;
import praktikum4Reservierungskomponente.Entitaeten.EReservierung;
import praktikum4Reservierungskomponente.Entitaeten.EZusatzleistungen;

public class VReservierungsServices {

	private static String INSERT = "INSERT INTO ";

	public static Statement statement() {

		try {

			Class.forName("oracle.jdbc.driver.OracleDriver");
			String url = "jdbc:oracle:thin:@oracle.informatik.haw-hamburg.de:1521:inf09";
			Connection con = DriverManager.getConnection(url,
					praktikum4GastKomponente.Connection.ConnectionDATA.ACC,
					praktikum4GastKomponente.Connection.ConnectionDATA.PASS);
			return con.createStatement();

		} catch (SQLException e) {
			throw new ExceptionInInitializerError("Conection Faild");
		} catch (ClassNotFoundException e) {
			throw new ExceptionInInitializerError("Conection Faild");
		}
	}

	/**
	 * Die Initmethode koennte verwendet werden um nicht vorhandene Tabellen zu erzeugen
	 */
	public static void init() {
		// TODO
	}

	/**
	 * Diese Methode dient dem leeren der Tabellen bevor man testet, da es sonst zu Konflikten kommt
	 */
	public static void res() {
		try {
			Statement stmt = statement();
			stmt.executeQuery("DELETE FROM RESERVIERUNGZUSATZLEISTUNG");
			stmt.executeQuery("DELETE FROM RESERVIERUNG");
			stmt.executeQuery("DELETE FROM ZUSATZLEISTUNG");
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/**
	 * Mit dieser Methode werden die Daten aus der erzeugeZusatzleistung-Methode im Anwendungsfall
	 * an die Datenbank uebertragen
	 * @param eZusatzleistungen ist vom Objekt EZusatzleistungen welches alle erforderlichen Daten beinhaltet 
	 */
	public static void erzeugeZusatzleistung(EZusatzleistungen eZusatzleistungen) {
		Statement stmt = statement();

		String querry = INSERT + "ZUSATZLEISTUNG" + " VALUES ('"
				+ eZusatzleistungen.getName().getName() + "', "
				+ eZusatzleistungen.getZusatzleistungNr().getNr() + ")";

		System.out.println(querry);
		try {
			stmt.executeQuery(querry);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/**
	 * Mit dieser Methode werden die Daten aus der reserviereZimmer-Methode im Anwendungsfall
	 * an die Datenbank uebertragen
	 * @param eReservierung ist vom Objekt EReservierung welches alle erforderlichen Daten beinhaltet
	 */
	public static void reserviereZimmer(EReservierung eReservierung) {
		Statement stmt = statement();

		String querry = INSERT + "RESERVIERUNG" + " VALUES ("
				+ eReservierung.getReservierungsNr().getNr() + ", "
				+ eReservierung.getZimmerNr().getNr() + ", "
				+ eReservierung.getGastNr().getNr() + ")";

		System.out.println(querry);
		try {
			stmt.executeQuery(querry);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/**
	 * Mit dieser Methode werden die Daten aus der bucheZusatzleistungen-Methode im Anwendungsfall
	 * an die Datenbank uebertragen 
	 * @param dReservierungsNr ist vom Datentyp DReservierungsNr und ist die Nummer der Reservierung
	 * @param dZusatzleistungNr ist vom Datentyp DZusatzleistungNr und ist die Nummer der Zusatzleistung
	 */
	public static void bucheZusatzleistung(DReservierungsNr dReservierungsNr,
			DZusatzleistungNr dZusatzleistungNr) {
		Statement stmt = statement();

		String querry = INSERT + "RESERVIERUNGZUSATZLEISTUNG" + " VALUES ("
				+ dReservierungsNr.getNr() + ", " + dZusatzleistungNr.getNr()
				+ ")";

		System.out.println(querry);
		try {
			stmt.executeQuery(querry);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/**
	 * Diese Methode dient dem bestimmen der Anzahl der Reservierungen, die ein Gast getaetigt hat. Sie wird
	 * benoetigt um zu testen, ob der Gast schon ein Stammgast werden kann.
	 * @param dGastNr ist vom Datentyp DGastNr und beinhaltet die GastNr die ueberprueft werden soll
	 * @return die Anzahl der Reservierungen des Gastes als Integerwert.
	 */
	public static int anzahlReservierungen(DGastNr dGastNr) {
		int res = 0;
		Statement stmt = statement();
				
		String querry = "SELECT COUNT(DRESERVIERUNGSNR)AS count FROM RESERVIERUNG WHERE DGASTNR=" + dGastNr.getNr();
		
		System.out.println(querry);
		try {
			ResultSet rs = stmt.executeQuery(querry);
			rs.next();
			res = rs.getInt("count");
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}	
		return res;
	}

	/**
	 * Diese Methode bestimmt die Anzahl der Reservierungen mit Zusatzbuchungen eines Gastes. Dazu wird die Hilfmethode 
	 * welcheReservierungenHatGast benutzt.
	 * @param dGastNr ist vom Datentyp DGastNr und beinhaltet die Nummer der Gastes
	 * @return die Anzahl der Reservierungen mit Zusatzbuchungen als Integerwert.
	 */
	public static int anzahlReservierungenMitZusatzbuchung(DGastNr dGastNr) {
		Statement stmt = statement();
		ResultSet val = welcheReservierungHatGast(dGastNr);
		int result = 0;
		
		try {
			while (val.next()) {
				
				int x = val.getInt("DRESERVIERUNGSNR");
				String querry = "SELECT COUNT(DRESERVIERUNGSNR)AS count FROM RESERVIERUNGZUSATZLEISTUNG WHERE DRESERVIERUNGSNR=" + x;
				ResultSet rs = stmt.executeQuery(querry);
				rs.next();
				
				if(rs.getInt("count") > 0){
					result++;
				}

			}
		} catch (SQLException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}

		return result;
	}
	/**
	 * Diese Methode unterstuetz die Methode anzahlReservierungenMitZusatzbuchung. Sie ermittelt die Nummern der
	 * Reservierungen, die vom Gast getaetigt wurden.
	 * @param dGastNr ist vom Datentyp DGastNr und beinhaltet die Nummer des Gastes
	 * @return die Ergebnissammlung des SQL Befehles vom Datentyp ResultSet
	 */
	public static ResultSet welcheReservierungHatGast(DGastNr dGastNr){
		
		Statement stmt = statement();
		
		  //SELECT Name, Origin_x, Origin_y, Origin_z FROM room WHERE ID = 3 AS result
		String querry = "SELECT DRESERVIERUNGSNR FROM RESERVIERUNG WHERE DGASTNR=" + dGastNr.getNr();
		
		System.out.println(querry);
		try {
			ResultSet rs = stmt.executeQuery(querry);
			return rs;
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			throw new UnsupportedOperationException("FEHLER AUFGETRETEN. KEIN RUECKGABEWERT!");
		}
	}
}
